package ar.utn.frgp.banco.front.action.operaciones;

import java.io.Console;
import java.math.BigDecimal;
import java.util.List;

import org.apache.log4j.Logger;

import sun.util.logging.resources.logging;

import ar.utn.frgp.banco.entity.Cuenta;
import ar.utn.frgp.banco.entity.enums.TipoCuenta;
import ar.utn.frgp.banco.exceptions.PersonalisedException;
import ar.utn.frgp.banco.exceptions.ServiceException;
import ar.utn.frgp.banco.front.action.EBAbstractAction;
import ar.utn.frgp.banco.service.GestionCuentasService;

public class ExtraccionAction extends EBAbstractAction {

	
	private static final long serialVersionUID = 4396578966426567205L;

	private GestionCuentasService gestionCuentasService;
	
	private Long nroCuenta;
	
	private BigDecimal monto;

	private List<Cuenta> cuentas;
	
	@Override
	public String execute() throws PersonalisedException {
		// TODO Auto-generated method stub
		
		if (cuentas == null){
			cuentas = gestionCuentasService.obteneCuentas(getLoggedUser().getDni());
			
			if (cuentas.isEmpty()){
				return NONE;
			}
		}
		
		try {
			
			if (nroCuenta != null){
				
				Cuenta cuenta = gestionCuentasService.obtenerCuentaCompleta(nroCuenta);
				BigDecimal comision = new BigDecimal(1.0006);
				
				if(cuenta.getTipoCuenta() == TipoCuenta.CUENTA_CORRIENTE){
					monto = monto.multiply(comision);
				}
				
				gestionCuentasService.extraccion(nroCuenta, monto);
				return SUCCESS;
			}
			
			

		} catch (Exception e) {
			// TODO: handle exception
			addActionError("Saldo insuficiente.");
			return INPUT;
		}
		
		return INPUT;
	}

	/**
	 * @return the gestionCuentasService
	 */
	public GestionCuentasService getGestionCuentasService() {
		return gestionCuentasService;
	}

	/**
	 * @param gestionCuentasService the gestionCuentasService to set
	 */
	public void setGestionCuentasService(GestionCuentasService gestionCuentasService) {
		this.gestionCuentasService = gestionCuentasService;
	}

	/**
	 * @return the nroCuenta
	 */
	public long getNroCuenta() {
		return nroCuenta;
	}

	/**
	 * @param nroCuenta the nroCuenta to set
	 */
	public void setNroCuenta(long nroCuenta) {
		this.nroCuenta = nroCuenta;
	}

	/**
	 * @return the monto
	 */
	public BigDecimal getMonto() {
		return monto;
	}

	/**
	 * @param monto the monto to set
	 */
	public void setMonto(BigDecimal monto) {
		this.monto = monto;
	}
	
	/**
	 * @return the cuentas
	 * @throws PersonalisedException 
	 * @throws ServiceException 
	 */
	public List<Cuenta> getCuentas(){		
		return cuentas;
	}

	/**
	 * @param cuentas the cuentas to set
	 */
	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}

	
}
